// 控制页面登录权限的文件

// 权限拦截在路由跳转   导航守卫

import router from "@/router";

import store from '@/store'; //引入store实例 和组件中的ythis.$store是一回事

import nprogress from 'nprogress'; //引入进度条

import 'nprogress/nprogress.css' //引入进度条样式

// 不需要导出 因为只需要让代码执行即可

// 前置守卫

// next 是前置守卫必须必须必须执行的钩子  next必须执行 如果不执行 页面就死了

// next()  放过

// next(false)  跳转终止

// next(地址)  跳转到某个地址

// 定义白名单，白名单是没有token也可以进入的页面

const whiteList = ['/login', '/404']

router.beforeEach(async (to, from, next) => {

    nprogress.start() //开启进度条的意思
    if (store.getters.token) {
        // debugger
        // 只有有token的情况下 才能获取资料
        // 如果有token
        if (to.path === '/login') {
            // 如果访问的是登录页
            next('/') //跳到主页  //有token 用处理吗？ 不用

            // 代码执行进入这里面执行完的时候，并没有走后置守卫的代码，关闭进度条
        } else {
            // 只有放过的时候才去获取用户资料
            // 是每次都获取吗？
            // 如果当前vuex中有用户的资料的id 表示 已经有资料了 不需要获取了 如果没有id才需要获取
            // 如果不是登录页
            // if (!store.state.user.userInfo.userId) {
            if (!store.getters.userId) {
                // 如果没有id才表示当前用户资料没有获取过
                // async 函数所return的内容 用 await就可以接收到
                const { roles } = await store.dispatch('user/getUserInfo');
                // 如果说后续 需要根据用户资料获取数据的话 这里必须改成 同步
                // 筛选用户的可用路由
                // debugger
                const routes = await store.dispatch('permission/filterRoutes', roles.menus); //筛选得到当前用户可用的动态路由
                // // routes 就是筛选得到的动态路由
                // // console.log(routes);
                // // 将动态路由 添加到 路由表中 因为默认路由表 只有静态路由 没有动态路由
                // // addRoutes 必须 用 next(地址) 不能用 next()
                router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }]); //添加动态路由到路由表
                // // 添加完动态路由之后
                // // 如果进行了addRoutes 请用next(to.path) 否则会导致 刷新路由权限失败 这是一个已知缺陷
                next(to.path); //相当于跳到对应的地址 相当于多做一次跳转 为什么？
                // 进门了，但是进门之后我要去的地方的路还没有铺好，直接走，掉坑里，多做一次跳转，再从门外往里进一次，跳转之前，把路铺好，再次进来的时候，路就铺好了
            } else {
                next() //放行通过
            }

        }
    } else {
        // 如果没有token
        if (whiteList.indexOf(to.path) > -1) {
            // 如果访问的地址在白名单
            next() //放行通过
        } else {
            // 如果访问的地址不在白名单
            next('/login') //跳转到登录页
        }
    }
    nprogress.done() //手动强制关闭一次 为了解决 手动切换地址时 进度条的不关闭的问题

});

// 后置守卫

router.afterEach(() => {

    nprogress.done() //关闭进度条的意思

})
